package com.pe.pgn.clubpgn.webapp.controller.devolucionproveedor;

import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpbCategoria;
import com.pe.pgn.clubpgn.domain.ClpbDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.service.AlmacenService;
import com.pe.pgn.clubpgn.service.CategoriaService;
import com.pe.pgn.clubpgn.service.DevolucionProveedorService;
import com.pe.pgn.clubpgn.service.DocumentoMovArticuloDetService;
import com.pe.pgn.clubpgn.service.WizardArticuloService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;

@Controller
@RequestMapping("/devolucionproveedor/**")
public class DevolucionProveedorController extends BaseFormController{

	@Autowired
	private AlmacenService almacenService;

	@Autowired
	private DevolucionProveedorService devolucionService;	

	@Autowired
	private DocumentoMovArticuloDetService documentoDetService;	

	
	@Autowired
	private CategoriaService categoriaService;
	
	@Autowired
	private WizardArticuloService warticuloService;
	
	private static final String ES_EDITABLE = "esEditable";
	
	@RequestMapping(value = "/devolucionproveedorlist.html")
    public void listarDocumentosDevolucion(Model model) {
		List<ClpbAlmacen> almacenes = almacenService.obtenerAlmacenes(Boolean.FALSE);
		
		List<ClpbDocumentoMovArticulo> documentos = devolucionService.listaDocumentoDevolucion(); 
		//System.out.println("Mi lista de doc. es de " + documentos.size());
		model.addAttribute("documentos", documentos);
		model.addAttribute("almacenes", almacenes);
		model.addAttribute("fecha_documento_date_format", CLPConstantes.DATE_PATTERN);

    }
	
	@RequestMapping(value = "/devolucionproveedorform.html", method = RequestMethod.GET)
	public @ModelAttribute("devolucionproveedor") ClpbDocumentoMovArticulo verDevolucionProveedor(
				@RequestParam(value = "id", required = false) Long id, Model model) {
		model.addAttribute("fecha_documento_date_format", CLPConstantes.DATE_PATTERN);
		List<ClpbAlmacen> almacenes = almacenService.obtenerAlmacenes(Boolean.FALSE);		
		model.addAttribute("almacenes", almacenes);
		
		ClpbDocumentoMovArticulo documento = new ClpbDocumentoMovArticulo();
		if (id != null) {			
			List<BNArticulo> detalleDocumento = documentoDetService.obtenerArticulosDocumento(id);			
			documento = devolucionService.obtenerDocumentoDevolucion(id);
			model.addAttribute("articulos", detalleDocumento);			
			model.addAttribute(ES_EDITABLE, Boolean.FALSE);
			System.out.println("LA FECHA DEL DOCUMENTO ES:" + documento.getDaFechaDocumento());
			return documento;
		}
		
			documento.setDaFechaDocumento(Calendar.getInstance());
		return documento;
	}
	
	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/devolucionproveedorform.html", method = RequestMethod.POST)
	public String guardarDevolucionProveedor(@ModelAttribute("devolucionproveedor") ClpbDocumentoMovArticulo documento,
			BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {
		try {
			
				//Validando Stok disponible a devolver
				for (Iterator<BNArticulo> iter = documento.getArticulosDetalle().iterator(); iter.hasNext(); ) {
					BNArticulo articulo = iter.next();
					if (null!=articulo.getCoCodigoArticulo()){
						
						ClpdArticulo articuloBean = devolucionService.obtenerDatosArticuloByCode
						(articulo.getCoCodigoArticulo());
						
						if (articulo.getVaCantidad().doubleValue() > articuloBean.getVaStockDisponible().doubleValue()) {
							saveError(request, getText("devolucionproveedorForm.error.stockdisponible", articuloBean.getDeArticulo(), request.getLocale()));
							return "/devolucionproveedor/devolucionproveedorform";		
						}						
					}						
				}
				
				Map mapResult = devolucionService.guardarDocumentoDevolucion(documento);
				if(mapResult.get("msg").equals("success")){
					saveMessage(request, getText("devolucionproveedorForm.added", request.getLocale()));
					return "redirect:devolucionproveedorform.html?id="+documento.getId();
				}else{
					saveError(request, getText("errors.general", request.getLocale()));
					return "/devolucionproveedor/devolucionproveedorform";
				}		

			
		} catch (Exception e) {
			
			List<ClpbAlmacen> almacenes = almacenService.obtenerAlmacenes(Boolean.FALSE);

			model.addAttribute("almacenes", almacenes);
			System.out.println("Exception invisible "+e.getMessage());
			saveError(request, getText("errors.general", request.getLocale()));
			e.printStackTrace();
			return "/devolucionproveedor/devolucionproveedorform";
		}
		
	}	
	
	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/articuloForDevolucionProveedor.html", method = RequestMethod.GET)
	public String  listarArticulos(@RequestParam(value = "idAlmacen", required = true) Long idAlmacen,Model model) {
		
		Long idCategoria = Long.valueOf(0);
		List articulos = warticuloService.buscarArticulosDevolucion("", "", idCategoria, "", "", idAlmacen);	
		List<ClpbCategoria> categorias = categoriaService.obtenerCategorias();
		
		model.addAttribute("articulos", articulos);
		model.addAttribute("categorias", categorias);
		
		return "/wizard/articulodevolucionwizardform";
	}		
}
